#include "trabalho.h"
#include <stdio.h>
#include <string.h>

#define HOST "127.0.0.1"

void printPessoa(pessoa *p)
{
	printf("Index: %d\nNome: %s\nCidade: %s\nTelefone: %s\n-----------\n\n", p->index, p->nome, p->cidade, p->telefone);
}

void cadastrarPessoa()
{
	CLIENT *clnt;
	int  *result;
	char *buffer;
	pessoa p;
	
	buffer = (char *)malloc(32*sizeof(char));
	memset(buffer, 0, sizeof(buffer)); 
	
	printf("CADASTRO DE CONTATO:\n");
	
	printf("Digite o nome:");
	scanf("%s", buffer);
	strcpy(p.nome, buffer);
	
	printf("Digite a cidade:");
	scanf("%s", buffer);
	strcpy(p.cidade, buffer);
	
	printf("Digite o telefone:");
	scanf("%s", buffer);
	strcpy(p.telefone, buffer);
	
	clnt = clnt_create(HOST, TRABALHO, TRABALHOVERSION, "tcp");
	if(clnt == NULL)
	{
		clnt_pcreateerror(HOST);
		exit(1);
	}
	
	result = cadastra_0(&p, clnt);
	if(result == (int *) NULL)
	{
		clnt_perror(clnt, "call failed");
	}
	
	printf("Cadastro Realizado! (%s, %s, %s)\n", p.nome, p.cidade, p.telefone);
	
	clnt_destroy(clnt);
}

void listarServer()
{
	CLIENT *clnt;
	lista *result;
	lista lt;
	int i;
	int int_send = 5;
	
	clnt = clnt_create(HOST, TRABALHO, TRABALHOVERSION, "tcp");
	if(clnt == NULL)
	{
		clnt_pcreateerror(HOST);
		exit(1);
	}
	
	result = listar_0(&int_send, clnt);
	lt = *result;
	for(i = 0; i < lt.size; i++)
	{
		printPessoa(&lt.p[i]);
	}
	
	if(result == (lista *) NULL)
	{
		clnt_perror(clnt, "call failed");
	}
	
	clnt_destroy(clnt);
}

void excluirServer()
{
	CLIENT *clnt;
	int *result;
	//int int_send = 2;
	int int_send;
	
	listarServer();
	printf("Escolha o indice da pessoa que deseja excluir: ");
	scanf("%d", &int_send);
	
	clnt = clnt_create(HOST, TRABALHO, TRABALHOVERSION, "tcp");
	if(clnt == NULL)
	{
		clnt_pcreateerror(HOST);
		exit(1);
	}
	
	result = excluir_0(&int_send, clnt);
	if(result == (int *) NULL)
	{
		clnt_perror(clnt, "call failed");
	}
	
	clnt_destroy(clnt);
}

void editarServer()
{
	CLIENT *clnt;
	int  *result, index;
	char *buffer;
	pessoa p;
	
	buffer = (char *)malloc(32*sizeof(char));
	memset(buffer, 0, sizeof(buffer)); 
	
	listarServer();
	printf("Escolha o indice da pessoa que deseja editar: ");
	scanf("%d", &index);
	p.index = index;
	
	printf("Digite o nome:");
	scanf("%s", buffer);
	strcpy(p.nome, buffer);
	
	printf("Digite a cidade:");
	scanf("%s", buffer);
	strcpy(p.cidade, buffer);
	
	printf("Digite o telefone:");
	scanf("%s", buffer);
	strcpy(p.telefone, buffer);
	
	clnt = clnt_create(HOST, TRABALHO, TRABALHOVERSION, "tcp");
	if(clnt == NULL)
	{
		clnt_pcreateerror(HOST);
		exit(1);
	}
	
	result = editar_0(&p, clnt);
	if(result == (int *) NULL)
	{
		clnt_perror(clnt, "call failed");
	}
	
	clnt_destroy(clnt);
}

void consultaPessoa()
{
	CLIENT *clnt;
	lista  *l;
	lista lt;
	texto t;
	int i;
	
	printf("Digite o nome do Contato para busca:\n");
	scanf("%s", t.value);
	
	clnt = clnt_create(HOST, TRABALHO, TRABALHOVERSION, "tcp");
	if (clnt == NULL) {
		clnt_pcreateerror (HOST);
		exit (1);
	}

	l = consultapessoa_0(&t, clnt);
	lt = *l;
	for(i = 0; i < lt.size; i++)
	{
		printPessoa(&lt.p[i]);
	}
	
	if (l == (lista *) NULL) {
		clnt_perror(clnt, "call failed");
	}
	clnt_destroy (clnt);
}

void printTeste()
{
	CLIENT *clnt;
	int  *result;
	
	texto t;
	
	printf("Escreva algo para aparecer no servidor:\n");
	scanf("%s", t.value);
	printf("%s", t.value);
	
	clnt = clnt_create(HOST, TRABALHO, TRABALHOVERSION, "tcp");
	if(clnt == NULL)
	{
		clnt_pcreateerror(HOST);
		exit(1);
	}
	
	result = printteste_0(&t, clnt);
	
	if(result == (int *) NULL)
	{
		clnt_perror(clnt, "call failed");
	}
	
	clnt_destroy(clnt);
}

void printMenu(){
	printf("0) Sair\n");
	printf("1) Cadastrar um novo contato\n");
	printf("2) Excluir Contato\n");
	printf("3) Listar Contatos\n");
	printf("4) Buscar Contatos\n");
	printf("5) Editar Contato\n");
	printf("99) Print Teste\n");
	printf("Opcao:");
}

int executaOpcao(opcao)
{
	switch(opcao)
	{
		case 0:
		{
			return 0;
		} break;
		
		case 1:
		{
			cadastrarPessoa();
		} break;
		
		case 2:
		{
			excluirServer();
		} break;
		
		case 3:
		{
			listarServer();
		} break;
		
		case 4:
		{
			consultaPessoa();
		} break;
		
		case 5:
		{
			editarServer();
		} break;
		
		case 99:
		{
			printTeste();
		} break;
	}
	
	return 1;
}

int main (int argc, char *argv[])
{
	int running = 1;
	int opcao;
	while(running)
	{
		printMenu();
		scanf("%d", &opcao);
		running = executaOpcao(opcao);
	}
	exit(0);
}
